package 力扣_数学思维题;

/**50.Pow(x, n)
 * @author zx
 * @create 2022-04-27 11:16
 */
public class Num50 {
    /**
     每个二进制数位都有一个权值，权值如下图所示，最终结果就等于所有二进制位为1的权值之积,
     例如上述 x^77 次方对应的二进制 (1001101) 和每个二进制位的权值如下
     1	     0	     0	     1	     1	     0	     1
     x^64	x^32	x^16	x^8 	x^4	    x^2 	x^1
     最终结果就是所有二进制位为1的权值之积：x^1 * x^4 * x^8 * x^64 = x^77
     而且我们不必预先把每一个二进制位的权值计算出来,我们可以一边计算结果,一边计算权值
     * @return
     */
    // x为底数，n为幂数
    public double myPow(double x, int n) {
        double result = 1;
        long v = n;// 为了保证-n不溢出，先转换成long类型

        if(v < 0) {// 如果v小于0， 求1/x的-v次方
            x = 1 / x;
            v = -v;
        }
        while(v > 0) {
            if((v & 1) == 1) {//此处等价于if(v % 2 == 1)
                result *= x;
            }
            v >>= 1;//此处等价于v = v / 2
            x *= x;
        }
        return result;
    }
}
